// lib/Generator.js

const { getRepoList } = require('./http')
const ora = require('ora')
const inquirer = require('inquirer')
const util = require('util')
const path = require('path')
const downloadGitRepo = require('download-git-repo') // 不支持 Promise 安装：npm install download-git-repo --save

// 添加加载动画
async function wrapLoading(fn, message, ...args) {
  // 使用 ora 初始化，传入提示信息 message
  const spinner = ora(message);
  // 开始加载动画
  spinner.start();
  try {
    // 执行传入方法 fn
    const result = await fn(...args);
    // 状态为修改为成功
    spinner.succeed();
    return result||'success';
  } catch (error) {
    // 状态为修改为失败
    spinner.fail('请求失败...', error)
  }
}

class Generator {
  constructor(name, targetDir) {
    // 目录名称
    this.name = name;
    // 创建位置
    this.targetDir = targetDir;
    // 对 download-git-repo 进行 promise 化改造
    this.downloadGitRepo = util.promisify(downloadGitRepo);
  }

  // 获取用户选择的模板
  // 1）从远程拉取模板数据
  // 2）用户选择自己新下载的模板名称
  // 3）return 用户选择的名称

  async getRepo() {
    // 1）从远程拉取模板数据
    // const repoList = await wrapLoading(getRepoList, '正在加载模板库');
    //本地设置模板列表
    const repoList = [
      { name: '后台管理系统模板', path: 'admin-pro' },
      { name: '后台管理系统组件库', path: 'manager-components' },
      { name: 'H5组件库', path: 'h5-components' }
    ]
    if (!repoList) return;
    
    // 过滤我们需要的模板名称
    const repos = repoList.map(item => item.path);
    // 2）用户选择自己新下载的模板名称
    const { repo } = await inquirer.prompt({
      name: 'repo',
      type: 'list',
      choices: repos,
      message: 'Please choose a template to create project'
    })
    
    // 3）return 用户选择的名称
    return repo;
  }

  // 获取用户选择的版本
  // 1）基于 repo 结果，远程拉取对应的 tag 列表
  // 2）用户选择自己需要下载的 tag
  // 3）return 用户选择的 tag

  async getTag(repo) {
    // 1）基于 repo 结果，远程拉取对应的 tag 列表
    const tags = await wrapLoading(getTagList, 'waiting fetch tag', repo);
    if (!tags) return;

    // 过滤我们需要的 tag 名称
    const tagsList = tags.map(item => item.name);

    // 2）用户选择自己需要下载的 tag
    const { tag } = await inquirer.prompt({
      name: 'tag',
      type: 'list',
      choices: tagsList,
      message: 'Place choose a tag to create project'
    })

    // 3）return 用户选择的 tag   
    return tag
  }

  // 下载远程模板
  // 1）拼接下载地址
  // 2）调用下载方法
  async download(repo, tag) {
    // 1）拼接下载地址
    // const requestUrl = `zhurong-cli/${repo}${tag ? '#' + tag : ''}`;
    const requestUrl ='direct:https://gitee.com/mei-changsu/'
    // 2）调用下载方法
    return await wrapLoading( 
      this.downloadGitRepo, // 远程下载方法
      '正在下载模板', // 加载提示信息
      `${requestUrl}${repo}.git`, // 参数1: 下载地址
      // path.resolve(process.cwd(), this.targetDir),// 参数2: 创建位置
      this.targetDir,
      { clone: true },
    ) 
  }

  // 核心创建逻辑
  // 1）获取模板名称
  // 2）获取 tag 名称
  // 3）下载模板到模板目录
  async create() {

    // 1）获取模板名称
    const repo = await this.getRepo()


    // 2) 获取 tag 名称  注：本项目暂不使用版本
    // const tag = await this.getTag(repo)

    // 3）下载模板到模板目录
    // await this.download(repo, tag)
    const res = await this.download(repo, '')
    if (!res) {
      // 如果下载模板失败，退出执行进程
      console.log('下载失败\r\n')
      return process.exit(1);
    } 
    console.log('下载成功\r\n')
    
  }
}

module.exports = Generator;
